﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using Helper.Core.Entity;

namespace Helper.Tests.Business
{
    [TestClass]
    public class CreateSchemas
    {        
        /// <summary>
        /// Método para a configuração do NHibernate         
        /// </summary>
        /// <returns></returns>
        [TestMethod]               
        public Configuration ConfigureNHibernate() 
        {           
            Configuration config = new Configuration();
            //Configura o dialeto
            config.SetProperty(NHibernate.Cfg.Environment.Dialect, typeof(NHibernate.Dialect.FirebirdDialect).AssemblyQualifiedName);
            //Define a connection String
            String connectionString = "Server=localhost;Database=C:\\Helper\\DATABASE.FDB;User=SYSDBA;Password=masterkey;";
            //Configura a connection String
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionString, connectionString);
            //Configura o mostrar SQL                        
            config.SetProperty(NHibernate.Cfg.Environment.ShowSql,"true");
            //Configura o connection driver
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionDriver, typeof(NHibernate.Driver.FirebirdClientDriver).AssemblyQualifiedName);
            //Configura o provider
            config.SetProperty(NHibernate.Cfg.Environment.ConnectionProvider, typeof(NHibernate.Connection.ConnectionProvider).AssemblyQualifiedName);
            //Configura o proxy para a criação da factory do NHibernate
            config.SetProperty(NHibernate.Cfg.Environment.ProxyFactoryFactoryClass, typeof(NHibernate.Bytecode.ActivatorObjectsFactory).AssemblyQualifiedName);
            //Inicia o NHibernate
            config.Configure();
            //Retorna a configuração do NHibernate
            return config;
        }

        [TestMethod]
        public void CreateSchema()
        {
            //Variável que recebe a configuração do nhibernate
            var config = ConfigureNHibernate();
            config.AddAssembly(typeof(Post).Assembly);
            ///Atualiza e gera scripts do banco de dados
            var schema = new SchemaUpdate(config);
            ///
            schema.Execute(true, true);
            //Verifica se existe alguma excerção
            if (schema.Exceptions.Count > 0)
            {
                ///Se houver pelo menos uma excerção no teste 
                ///ela é lançada para que o teste de um erro e seja 
                ///homologado.
                 throw new Exception(schema.Exceptions.FirstOrDefault().Message);
            }
        }
    }
}
